#include <iostream>
#include <string>
#include <utility> // 引入 std::forward 用于参数的完美转发，尽管在此代码中未使用

// 声明一个可变参数模板类 Tuple
template<typename... Args>
class Tuple;

// 特化Tuple类，用于处理至少包含一个元素的情况
template<typename Head, typename... Tail>
class Tuple<Head, Tail...> : private Tuple<Tail...> { // 继承自包含余下元素的Tuple
    Head head; // 存储此位置的元素

public:
    // 构造函数，接收一个元素和余下的元素
    Tuple(Head h, Tail... t) : Tuple<Tail...>(t...), head(h) {}

    // 获取当前头部元素的值
    Head getHead() const { return head; }

    // 模板成员函数，用于获取指定索引位置的元素
    template<std::size_t N>
    decltype(auto) get() const {
        if constexpr (N == 0) {
            // 如果索引为0，返回当前头部元素
            return head;
        } else {
            // 否则递归调用get，索引减一，查询余下的Tuple
            return Tuple<Tail...>::template get<N-1>();
        }
    }
};

// 特化一个空的Tuple，用于终止递归
template<>
class Tuple<> {
    // 这个类不包含成员，只是作为递归终止的标识
};

int main() {
    // 创建一个包含int, double和std::string的Tuple
    Tuple<int, double, std::string> t(1, 2.3, "hello");
    // 输出元组中的每个元素，使用get<索引>()来访问
    std::cout << "Tuple contains: " << t.get<0>() << ", " << t.get<1>() << ", " << t.get<2>() << std::endl;
    return 0;
}